/*
 * CarController.h
 *
 *  Created on: 21/11/2009
 *      Author: Facu
 */

#ifndef CARCONTROLLER_H_
#define CARCONTROLLER_H_

#include "map/car/Car.h"
#include "map/Intersection.h"
#include "map/MapPoint.h"
#include "map/RoadSegment.h"
#include "util/LinkedList.h"
#include "util/Subject.h"
#include "map/controllers/RouteController.h"

/* Clase que se encarga de controlar el estado del auto dentro del mapa. */
class CarController: public Subject {

public:

	CarController(map::Car* car, RouteController* routeController);

	virtual ~CarController();

	virtual void accelerate();

	virtual void decelerate();

	virtual void stop();

	virtual MapPoint getCarPosition();

	virtual double getAngle();

	virtual RoadSegment* getCurrentRoadSegment();

	virtual void setCurrentRoadSegment(RoadSegment* currentRoadSegment);

	/* Le avisa al auto que al llegar a la esquina tiene que intentar doblar a la izquierda */
	virtual void turnLeftOnCorner();

	/* Le avisa al auto que al llegar a la esquina tiene que intentar doblar a la derecha */
	virtual void turnRightOnCorner();

	/* Le avisa al auto que al llegar a la esquina tiene que seguir derecho */
	virtual void goStraight();

	/* Devuelve la accion que el auto intentara hacer al llegar a la esquina */
	virtual RoadNavigation getNextAction();

	/* Actualiza la posicion del auto segun la velocidad del mismo, y el tiempo pasado por parametro.
	 * El auto interrumpira el avance en caso de llegar a la esquina.	 */
	virtual void advance(double deltaT);

	virtual int getCarSpeed();

	virtual int getMaxCarSpeed();

	virtual bool goingWrongWay();

	virtual bool isExceedingMaxSpeed();

	virtual void performMovement(double deltaT);

private:

	virtual void turnLeft();

	virtual void turnRight();

	map::Car* car;
	RoadNavigation actionOnCorner;
	RoadSegment* currentRoadSegment;
	RouteController* routeController;

};

#endif /* CARCONTROLLER_H_ */
